/***
 * @Description:主要包括了整个系统的debug输出功能的实现，其中包括提示，告警，错误等功能的实现的头文件
 * @Author: Liverpool
 * @Date: 2024-02-11 15:21:34
 * @LastEditTime: 2024-02-11 15:22:06
 * @LastEditors: Liverpool
 */
#ifndef DEBUG_H
#define DEBUG_H

#include "sys_plat.h"
#include "string.h"
#include "stdarg.h"
#include "config.h"

#define D_DEBUG_DirectorySplit 1 // 定义文件分离的方式 1 表示使用代码分离 2 表示使用string库函数分离

// 定义debug输出风格
#define D_DEBUG_Style_ReSet "\033[0m"         // 输出风格重置
#define D_DEBUG_Style_Error "\033[0;31;40m"   // 输出风格为错误: 红色报警
#define D_DEBUG_Style_Warning "\033[0;33;40m" // 输出风格为报警：黄色提示
// 定义debug的输出等级 等级越小输出的信息就越少
#define D_DEBUG_Level_None 0
#define D_DEBUG_Level_Error 1
#define D_DEBUG_Level_Warning 2
#define D_DEBUG_Level_Info 3

/***
 * @description:打印提示内容
 * @Author: Liverpool
 * @Date: 2024-02-11 15:39:02
 * @param module 各模块的输出等级
 * @param format 需要打印的格式化的字符串
 * @param ...    需要进行格式化字符串的参数变量
 * @return {*}
 */
#define debug_error(module, format, ...) debug_printf(module, D_DEBUG_Level_Error, __FILE__, __FUNCTION__, __LINE__, format, ##__VA_ARGS__)
#define debug_Warning(module, format, ...) debug_printf(module, D_DEBUG_Level_Warning, __FILE__, __FUNCTION__, __LINE__, format, ##__VA_ARGS__)
#define debug_info(module, format, ...) debug_printf(module, D_DEBUG_Level_Info, __FILE__, __FUNCTION__, __LINE__, format, ##__VA_ARGS__)

/***
 * @description:断言的实现：表达式为真不进行任何处理；表达式为假需要程序死机，并报错
 * @Author: Liverpool
 * @Date: 2024-02-11 15:39:02
 * @param expression 需要进行判断的表达式
 * @param format 需要打印的格式化的字符串
 * @return {*}
 */
#define debug_assert(expression, message)                                                                                                    \
    {                                                                                                                                        \
        if (!(expression))                                                                                                                   \
        {                                                                                                                                    \
            debug_printf(D_DEBUG_Level_Error, D_DEBUG_Level_Error, __FILE__, __FUNCTION__, __LINE__, "assert failed:" #message "," message); \
            while (1)                                                                                                                        \
                ;                                                                                                                            \
        }                                                                                                                                    \
    }

void debug_printf(int module_level, int output_level, const char *file, const char *fun, int line, const char *format, ...); // debug的调用打印输出信息函数
void debug_dump_hwaddr(const char *msg, const uint8_t *hwaddr, int len);                                                     // 打印网络接口的硬件地址
void debug_dump_ipaddr(const char *msg, const struct ip_addr *ipaddr);                                                       // 打印网络接口的IP地址
void debug_dump_ipaddr_buf(const char *msg, const uint8_t *ipaddr);                                                          // 打印IP地址（从uint8的buf中打印）
#define Debug_Display_Enable(module) (module >= D_DEBUG_Level_Info)                                                          // 定义文件是否展示相关信息
#endif                                                                                                                       // !DEBUG_H
